package com.travel.common;

import lombok.Data;

/**
 * 用户线程上下文
 * 用于存储当前线程中的用户信息，如用户ID和偏好语言
 * 主要用于在不同层之间传递用户信息，而不需要显式地通过参数传递
 * 
 */
public class UserContext {
    
    /**
     * 使用ThreadLocal存储用户上下文信息
     * 确保线程安全，每个线程拥有自己独立的用户上下文
     */
    private static final ThreadLocal<UserContextInfo> CONTEXT = new ThreadLocal<>();
    
    /**
     * 设置用户上下文信息
     * 
     * @param userId 用户ID
     * @param preferredLanguage 偏好语言
     */
    public static void set(Long userId, String preferredLanguage, String username) {
        UserContextInfo info = new UserContextInfo();
        info.setUserId(userId);
        info.setPreferredLanguage(preferredLanguage);
        info.setUsername(username);
        CONTEXT.set(info);
    }
    
    /**
     * 获取当前线程的用户ID
     * 
     * @return 用户ID，如果未设置则返回null
     */
    public static Long getUserId() {
        UserContextInfo info = CONTEXT.get();
        return info != null ? info.getUserId() : null;
    }
    
    /**
     * 获取当前线程的用户偏好语言
     * 
     * @return 偏好语言，如果未设置则返回null
     */
    public static String getPreferredLanguage() {
        UserContextInfo info = CONTEXT.get();
        return info != null ? info.getPreferredLanguage() : null;
    }

    /**
     * 获取当前线程的用户username
     *
     * @return username 未设置返回null
     */
    public static String getUsername() {
        UserContextInfo info = CONTEXT.get();
        return info != null ? info.getUsername() : null;
    }
    
    /**
     * 清除当前线程的用户上下文信息
     * 防止内存泄漏，在请求结束时应当调用此方法
     */
    public static void clear() {
        CONTEXT.remove();
    }
    
    /**
     * 内部类，用于存储用户上下文的具体信息
     */
    @Data
    private static class UserContextInfo {
        /**
         * 用户ID
         */
        private Long userId;
        
        /**
         * 用户偏好语言
         */
        private String preferredLanguage;

        /**
         * 用户username
         */
        private String username;
    }
} 